import store from "@/store";
import Vue from "vue";
import VueRouter from "vue-router";

// 引入路由表
import routes from "./routes";

// 使用插件
Vue.use(VueRouter);

/* 
为什么重写push方法?
 - vue-router在3.1.0版本之后,push和replace方法,会返回一个promise对象
 - 如果跳转相同的路由(连续点击多次), 就会报错 promise uncaught异常.
解决方法?
  - 降低vue-router版本  缺点:无法使用新功能 不建议
  - 使用catch捕获异常  缺点: 每次使用push或replace时都需要用catch捕捉错误 不建议 
  - 在router/index.js导入VueRouter的时候，进行全局的处理 将旧的push方法 保存 并重写新的push方法
*/

// 保存原始的push方法
const lastPush = VueRouter.prototype.push;

VueRouter.prototype.push = function (location) {
  // 调用原来的push函数，并捕获异常
  return lastPush.call(this, location).catch((error) => error);
};

// 重写replace方法
const lastReplace = VueRouter.prototype.replace;
VueRouter.prototype.replace = function (location) {
  // 调用原来的push函数，并捕获异常
  return lastReplace.call(this, location).catch((error) => error);
};

const router = new VueRouter({
  mode: "history", // 路由模式
  routes,
  // 跳转路由时 视口在最顶部
  scrollBehavior() {
    return {
      x: 0,
      y: 0,
    };
  },
});

// 白名单 不需要登录就能访问的页面
const whitePath = ["login", "home" , "register"];

/* 
路由守卫
*/

router.beforeEach(async (to, from, next) => {
  //token前台校验(路由跳转权限控制)
  const token = store.state.user.token;
  //判断token是否存在
  if (token) {
    //如果token存在
    //判断我去的地方是不是登录页,如果是则直接去home即可
    if (to.name === "login") {
      next("/home");
    } else {
      //判断使用有用户信息
      const isUserInfo = !!store.state.user.userInfo.nickName;
      console.log(isUserInfo);
      if (isUserInfo) {
        //如果用户信息存在 则直接放行
        next();
      } else {
        try {
          // //如果用户信息不存在,则获取用户的信息
          await store.dispatch("user/getUserInfo");
          //如果用户信息请求成功则直接放行
          next();
        } catch (e) {
          alert(e.message)
          //如果请求用户信息失败，则直接去重新登录
          await store.dispatch("user/getLogout"); //重置user中的所有信息
          next(`/login?redirect=${to.name}`);
        }
      }
    }
  } else {
    //如果token不存在
    //判断当前去的地方是白名单
    if (whitePath.includes(to.name)) {
      //如果去的地方不需要登录则直接放行
      next();
    } else {
      //否则再次登录
      next(`/login?redirect=${to.name}`);
    }
  }
});

/* router.beforeEach(async (to, from, next) => {
  // 获取token
  const { token } = store.state.user;
  // 判断是否有token
  if (token) {
    if (to.name === "login") {
      next("/home");
    } else {
      // 如果去别的页面 则判断是否有用户信息
      if (!!store.state.user.userInfo.nickName) {
        next();
      } else {
        try {
          // 请求用户信息
          await store.dispatch("user/getUserInfo");
          next();
        } catch (e) {
          // 如果请求失败 那么去重新登陆
          store.dispatch("user/getLogout"); // 重置user中的所有信息
          next(`/login?redirect=${to.name}`); // 再次登录跳转到重定向得页面
        }
      }
    }
  } else {
    // 如果token不存在
    // 判断是否去白名单
    if (whitePath.includes(to.name)) {
      next();
    } else {
      next(`/login?redirect=${to.name}`); // 再次登录并跳转到重定向得页面
    }
  }
}); */
export default router;
